package shiyl.use.springboot.loadbalance;

import java.util.List;

/**
 * 负载均衡策略抽象实现
 * @author shiyl
 */
public abstract class AbstractLoadBalancePolicy implements ILoadBalancePolicy {

    /**
     * 根据负载均衡策略，选择负载点，并返回实际负载处理者（T）
     *
     * @param loaders
     * @return
     */
    @Override
    public <T> T selectEndpoint(List<ILoader<T>> loaders) {
        return selectLoader(loaders).getEndpoint();
    }

    /**
     * 根据负载均衡策略，选择并返回负载点
     *
     * @param loaders
     * @return
     */
    @Override
    public <T> ILoader<T> selectLoader(List< ILoader<T>> loaders) {

        if( null == loaders || loaders.size() == 0 ){
            return null ;
        }

        if( loaders.size() == 1 ){
            return loaders.get(0) ;
        }

        return doPolicySelect( loaders) ;
    }

    /**
     * 执行负载策略选择负载点并返回
     * @param loaders
     * @param <T>
     * @return
     */
    protected abstract <T> ILoader<T> doPolicySelect(List<ILoader<T>> loaders);
}

